﻿using Cirrious.MvvmCross.ViewModels;
using System;

namespace TeaLightV5.Foundation.MvvmCross.ViewModels
{
    public abstract class TeaNotifyPropertyChanged : MvxNotifyPropertyChanged
    {
        /// <summary>
        /// Checks if a property already matches a desired value.  Sets the property and
        /// notifies listeners only when necessary.
        /// </summary>
        /// <typeparam name="T">Type of the property.</typeparam>
        /// <param name="storage">Reference to a property with both getter and setter.</param>
        /// <param name="value">Desired value for the property.</param>
        /// <param name="propertyName">Name of the property used to notify listeners.  This
        /// value is optional and can be provided automatically when invoked from compilers that
        /// support CallerMemberName.</param>
        /// <returns>True if the value was changed, false if the existing value matched the
        /// desired value.</returns>
        protected bool SetProperty<T>(ref T storage, T value, String propertyName = null)
        {
            if (Equals(storage, value)) return false;

            storage = value;
            OnPropertyChanged(propertyName);
            return true;
        }

        ///// <summary>
        ///// Notifies listeners that a property value has changed.
        ///// </summary>
        ///// <param name="propertyName">Name of the property used to notify listeners.  This
        ///// value is optional and can be provided automatically when invoked from compilers
        ///// that support <see cref="CallerMemberNameAttribute"/>.</param>
        protected void OnPropertyChanged(string propertyName = null)
        {
            RaisePropertyChanged(propertyName);
        }
    }
}